/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package logica;

import fisica.CapaFisica;
import fisica.PersonaDeContactoFisica;
import hibernate.objeto.Paciente;
import hibernate.objeto.Persona;
import hibernate.objeto.PersonaDeContacto;

/**
 *
 * @author Gonzalo
 */
public class PersonaDeContactoLogica extends CapaLogica {

    /**
     * Crea y persiste la persona de contacto para el paciente.
     *
     * @param datosPaciente Los datos del paciente
     * @param idPersonaDeContacto El arreglo en donde se guarda el id del objeto
     * PersonaDeContacto creado para su posterior recuperación
     * @return true si se agregó/modificó correctamente, false en caso contrario
     */
    public static boolean agregarOModificarPersonaDeContacto(
            Object[] datosPaciente, int[] idPersonaDeContacto) {
        //Crea el objeto
        PersonaDeContacto personaDeContacto =
                crearUObtenerObjetoPersonaDeContacto(datosPaciente);

        //Persiste el objeto
        if (CapaFisica.guardarOActualizarObjeto(personaDeContacto)) {
            idPersonaDeContacto[0] = personaDeContacto.getIdPersonaDeContacto();
            return true;
        } else {
            return false;
        }
    }

    /**
     * Actualiza una persona de contacto.
     *
     * @param datosActualizacion La actualización de la persona de contacto
     * @return true si se reasignó correctamente, false en caso contrario
     */
    public static boolean actualizarPersonaDeContacto(
            Object[] datosActualizacion) {

        //Modifica el arreglo para poder reulizar código
        Object[] datosPaciente = new Object[23];

        datosPaciente[PERSONA_TIPO_DE_DOCUMENTO] =
                ((Paciente)datosActualizacion[
                REASIGNACION_CONTACTO_OBJETO_PACIENTE]).getPersona().
                getTipoDeDocumentoPersona();

        datosPaciente[PERSONA_NUMERO_DE_DOCUMENTO] =
                ((Paciente)datosActualizacion[
                REASIGNACION_CONTACTO_OBJETO_PACIENTE]).getPersona().
                getNumeroDeDocumentoPersona();
        
        datosPaciente[PACIENTE_VINCULO_PERSONA_DE_CONTACTO] = datosActualizacion[
                REASIGNACION_CONTACTO_VINCULO_PERSONA_DE_CONTACTO];

        datosPaciente[PACIENTE_PERSONA_DE_CONTACTO] = PersonaLogica.
                getPersonaPorIdYEnBd(((Persona)datosActualizacion[
                REASIGNACION_CONTACTO_OBJETO_PERSONA_DE_CONTACTO]).getIdPersona());

        PersonaDeContacto personaDeContacto = crearUObtenerObjetoPersonaDeContacto(
                datosPaciente);

        if (CapaFisica.guardarOActualizarObjeto(personaDeContacto)) {
            return true;
        } else {
            return false;
        }
    }

    /**
     * Crea/modifica un objeto persona de contacto con los datos pasados por
     * parámetro.
     *
     * @param datosPaciente Los datos del paciente
     * @return El objeto PersonaDeContacto recien creado
     */
    private static PersonaDeContacto crearUObtenerObjetoPersonaDeContacto(
            Object[] datosPaciente) {
        PersonaDeContacto personaDeContacto = null;
        Paciente pacienteTemp =
                PacienteLogica.getPacientePorDocumento(
                datosPaciente[PERSONA_TIPO_DE_DOCUMENTO].toString(),
                datosPaciente[PERSONA_NUMERO_DE_DOCUMENTO].toString());
        if (pacienteTemp != null) {
            personaDeContacto = pacienteTemp.getPersonaDeContacto();
        }

        //Si el paciente no tiene persona de contacto, le creo
        if (personaDeContacto == null) {
            personaDeContacto = new PersonaDeContacto();
        }

        Persona persona = PersonaLogica.getPersonaPorIdYEnBd(
                ((Persona) (datosPaciente[
                CapaLogica.PACIENTE_PERSONA_DE_CONTACTO])).getIdPersona());

        personaDeContacto.setPersona(persona);
        
        personaDeContacto.setVinculoPersonaDeContacto(datosPaciente[
                CapaLogica.PACIENTE_VINCULO_PERSONA_DE_CONTACTO].toString());

        return personaDeContacto;
    }

    /**
     * Retorna el objeto PersonaDeContacto según el id.
     *
     * @param idPersonaDeContacto El id de la persona de contacto
     * @return El objeto PersonaDeContacto consultado, null si no existe
     */
    public static PersonaDeContacto getPersonaDeContactoPorId(
            int idPersonaDeContacto) {
        return PersonaDeContactoFisica.getPersonaDeContactoPorId(
                idPersonaDeContacto);
    }

    /**
     * Comprueba si existe la persona como persona de contacto.
     *
     * @param persona La persona consultada
     * @return true si existe, false en caso contrario
     */
    public static boolean esPersonaDeContacto(Persona persona) {
        return (PersonaDeContactoFisica.getPersonaDeContactoPorIdPersona(
                persona.getIdPersona()) != null);
    }

    /**
     * Retorna el texto HTML correspondiente a la descripcion de la persona de
     * contacto.
     *
     * @param personaDeContacto La persona de contacto
     * @return El String que contiene el HTML
     */
    public static String getPersonaDeContactoHTML(PersonaDeContacto personaDeContacto) {
        String personaDeContactoHTML = "";
        
        if (personaDeContacto != null) {
            personaDeContactoHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">PERSONA DE CONTACTO</font><br> " +
                    "<font size=\"3\" face=\"arial\" color=\"black\">Relación: </font>"
                    + "<font size=\"3\" face=\"arial\">" +
                    personaDeContacto.getVinculoPersonaDeContacto() + "</font><br>" +
                    PersonaLogica.getPersonaHTML(personaDeContacto.getPersona());
        } else {
            personaDeContactoHTML =
                    "<font size=\"3\" face=\"arial\" color=\"blue\">PERSONA DE CONTACTO</font><br> " +
                    "<font size=\"3\" face=\"arial\">No posee</font><br></font>";
        }
        
        return personaDeContactoHTML;
    }

}
